package com.hf.array;

import java.util.Arrays;

public class TestDriver {
    public static void main(String[] args) {
        twoArray();
        System.out.println("====================");
        test01();
        System.out.println("====================");
        test02();
        System.out.println("====================");
        test03();
        System.out.println("====================");
        test04();
        System.out.println("====================");
        test05();
        System.out.println("====================");
        test06();

    }
    /**
     * 数组扩容-system
     */
    public static void test06(){
        //定义数组
        int[] arr = new int[]{1,4,3,5,6};
        //扩容数组
        int[] newarr = new int[20];
        //使用System工具类扩容(要扩容的数组，开始位置，扩容后的数组，开始位置，copy的长度)
        System.arraycopy(arr, 2, newarr, 0, 2);
        parArr(newarr);
        System.out.println("判断扩容前后是不是同一存储单元"+(arr == newarr));
        arr = newarr;
    }
    /**
     * 数组扩容-Arrays
     */
    public static void test05(){
        //定义数组
        int[] arr = new int[]{1,4,3,5,6};
        //使用Arrays工具类扩容
        int[] newarr = Arrays.copyOf(arr, 10);
        parArr(newarr);
        System.out.println("判断扩容前后是不是同一存储单元"+(arr == newarr));
        arr = newarr;
    }
    /**
     * 冒泡排序-控制优化
     */
    public static void test04(){
        int count = 0;
        int[] arr2 = new int[]{1,2,3,45,6,7,89,10,11,12};
        //外层循环
        for(int i =0; i<arr2.length; i++){
            // 设置一个标志位，记录是否发生了交换，如果本轮没有发生交换，则说明数列已经有序
            boolean isChanged = false;
            // 默认没有发生交换
            for (int j = 0; j < arr2.length - 1; j++){
                count++;
                if(arr2[j] > arr2[j + 1]){
//                    交换
                    int temp = arr2[j];
                    arr2[j] = arr2[j + 1];
                    arr2[j + 1] = temp;

                    //发生了交换
                    isChanged = true;
                }
            }
            if (isChanged){
                break;
            }
        }
        System.out.println("比较的次数"+count);
        parArr(arr2);
    }

    /**
     * 冒泡排序-优化
     */
    public static void test03(){
        int count = 0;
        int[] arr2 = new int[]{1,2,3,45,6,7,89,10,11,12};
        for(int i =0; i<arr2.length; i++){
            for (int j = 0; j < arr2.length - i - 1; j++){
                count++;
                if(arr2[j] > arr2[j + 1]){
                    int temp = arr2[j];
                    arr2[j] = arr2[j + 1];
                    arr2[j + 1] = temp;
                }
            }
        }
        System.out.println("比较的次数"+count);
        parArr(arr2);
    }
    /**
     * 冒泡排序
     */
    public static void test02(){
        int count = 0;
        int[] arr2 = new int[]{1,2,3,45,6,7,89,10,11,12};
        for(int i =0; i<arr2.length; i++){
            for (int j = 0; j < arr2.length - 1; j++){
                count++;
                if(arr2[j] > arr2[j + 1]){
                    int temp = arr2[j];
                    arr2[j] = arr2[j + 1];
                    arr2[j + 1] = temp;
                }
            }
        }
        System.out.println("比较的次数"+count);
        parArr(arr2);
    }
    /**
     * 工具类排序
     */
    public static void test01(){
        int[] arr2 = new int[]{1,2,3,45,6,7,89,10,11,12};
        Arrays.sort(arr2);
        //遍历
        parArr(arr2);
        System.out.println();
    }

    /**
     * 二维数组
     */
    public static void twoArray(){
        int[][] arr1 = new int[3][];
        int[][] arr2 = new int[][]{{1,2,3,4},{5,6,7,8},{9,10,11,12}};
        int[][] arr3 = {{1,2,3},{4,5},{6,7,8}};

        //二维数组的遍历
        for(int i = 0; i<arr2.length; i++){
            for (int j = 0; j<arr2[i].length; j++){
                System.out.print("    "+arr2[i][j]);
            }
        }
        System.out.println();
    }

    /**
     * 一维数组
     */
    public static void oneArray(){
        int[] arr2 = new int[]{1,2,3,45,6,7,89,10,11,12};
        //遍历
        // 增强型的for 不会产生越界；但是也不知道当前遍历元素的下标
        for (int i : arr2){
            System.out.println("    "+i);
        }
    }

    /**
     * 数组的遍历
     * @param arr 要遍历的数组
     */
    public static void parArr(int[] arr){
        for (int i : arr){
            System.out.print("    "+i);
        }
        System.out.println();
    }
}
